﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

/*
 * 此类貌似比较简单，而<https://github.com/libgit2/libgit2sharp/>（支持 NuGet）可能是更好的选择。
 * 
 */


namespace LunarSF.SHomeWorkshop.LunarMarkdownEditor
{
    /// <summary>
    /// 此类修改自：<https://blog.csdn.net/lingyanpi/article/details/72472958>
    /// 原作者貌似是：爱思考的孩子...
    /// 谨此致谢...
    /// 
    /// 原文件是用在 Unity3d工程中，使用 C# 来获取 git commit id，其中一些环境方法不能使用。
    /// </summary>
    public class GitUtils
    {
        /// <summary>
        /// 【慎用方法】用于从操作系统环境变量中获取 Git 的安装位置。
        /// 
        /// 该方法在使用前需要根据需要修改！！！目前仅提供一个思路。
        /// 
        /// > 其实从注册表中也能找到 Git 安装路径，但可能分 64 位与 32 位——我手上没有 32 位的机器，暂时就用这个好了。
        /// </summary>
        public static string EnvironmentVariable
        {
            get
            {
                string sPath = System.Environment.GetEnvironmentVariable("Path");
                var result = sPath.Split(';');
                for (int i = 0; i < result.Length; i++)
                {
                    if (result[i].Contains(@"Git\bin") || result[i].Contains(@"Git\cmd"))
                    {
                        sPath = result[i];
                    }
                }
                return sPath;
            }
        }

        /// <summary>
        /// 【待完善方法】在当前工作区目录下，打开 Git Bash。
        /// </summary>
        public static void OpenGitBashOnCurrentWorkspace()
        {
            try
            {
                var gitPath = EnvironmentVariable;  //这个值在我的机器上是 @"C:\Program Files\Git\cmd"    结尾无反斜杠。
                                                    // git-bash.exe 在我的机器上的默认路径是： @"C:\Program Files\Git\git-bash.exe";
                string gitBashPath = gitPath.Substring(0, gitPath.Length - 3) + @"git-bash.exe";  // 去除路径中多余的 cmd 
                if (System.IO.File.Exists(gitBashPath) == false)
                {
                    var configGitBashPath = App.ConfigManager.Get("GitBashPath");
                    if (System.IO.File.Exists(configGitBashPath) == false)
                    {
                        gitBashPath = InputBox.Show(Globals.AppName, "在默认位置未找到 Git Bash 应用程序。\r\n\r\n请输入正确的程序路径：",
                            gitBashPath, true);
                        if (System.IO.File.Exists(gitBashPath))
                        {
                            LMessageBox.Show("输入的路径不正确！", Globals.AppName, System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Warning);
                            return;
                        }
                        else
                        {
                            App.ConfigManager.Set("GitBashPath", gitBashPath);
                        }
                    }
                    else gitBashPath = configGitBashPath;
                }
                var workspacePath = Globals.PathOfWorkspace;
                System.IO.Directory.SetCurrentDirectory(workspacePath);
                System.Diagnostics.Process.Start(gitBashPath);
            }
            catch (Exception ex)
            {
                LMessageBox.ShowWarning(ex.Message);
            }
        }

        /// <summary>
        /// 【待完善方法】在当前工作区目录下，打开 Git Bash。
        /// </summary>
        public static void OpenGitGuiOnCurrentWorkspace()
        {
            try
            {
                var gitPath = EnvironmentVariable;
                string gitGuiPath = gitPath + @"\git-gui.exe";  // @"C:\Program Files\Git\cmd\git-gui.exe";
                if (System.IO.File.Exists(gitGuiPath) == false)
                {
                    var configGitGuiPath = App.ConfigManager.Get("GitGuiPath");
                    if (System.IO.File.Exists(configGitGuiPath) == false)
                    {
                        gitGuiPath = InputBox.Show(Globals.AppName, "在默认位置未找到 Git GUI 应用程序。\r\n\r\n请输入正确的程序路径：",
                            gitGuiPath, true);
                        if (System.IO.File.Exists(gitGuiPath))
                        {
                            LMessageBox.Show("输入的路径不正确！", Globals.AppName, System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Warning);
                            return;
                        }
                        else
                        {
                            App.ConfigManager.Set("GitGuiPath", gitGuiPath);
                        }
                    }
                    else gitGuiPath = configGitGuiPath;
                }
                var workspacePath = Globals.PathOfWorkspace;
                System.IO.Directory.SetCurrentDirectory(workspacePath);
                System.Diagnostics.Process.Start(gitGuiPath);
            }
            catch (Exception ex)
            {
                LMessageBox.ShowWarning(ex.Message);
            }
        }

        /// <summary>
        /// 【修改过的方法】获取最后一次提交的 CommitID。
        /// </summary>
        public static void GetCommitID()
        {
            string gitPath = System.IO.Path.Combine(EnvironmentVariable, "git.exe");
            Debug.Write("环境路径：{0}", gitPath);
            Process p = new Process();
            p.StartInfo.FileName = gitPath;
            p.StartInfo.Arguments = "rev-parse HEAD";
            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardOutput = true;
            p.OutputDataReceived += OnOutputDataReceived;
            p.Start();
            p.BeginOutputReadLine();
            p.WaitForExit();
        }

        /// <summary>
        /// 【修改过的方法】
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private static void OnOutputDataReceived(object sender, DataReceivedEventArgs e)
        {
            if (e != null && !string.IsNullOrEmpty(e.Data))
            {
                Debug.Write(e.Data);
            }
        }
    }
}
